package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.ColoniaCalleDAO;
import mx.ipn.persistencia.dao.DireccionDAO;
import mx.ipn.to.DireccionTO;
import mx.ipn.to.ColoniaCalleTO;

public class DireccionDAOMySQL implements DireccionDAO {
	 static{FabricaDeDAOsMySQL.iniciaLog(DireccionDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO direccion (numero,interior,entre_calles,otras_referencias,id_colonia_calle) VALUES(?,?,?,?,?)";
	private static final String DELETE = "DELETE FROM direccion WHERE id_direccion=?";
	private static final String UPDATE = "UPDATE direccion SET numero=?,interior=?,entre_calles=?,otras_referencias=?,id_colonia_calle=? WHERE id_direccion=?";
	private static final String FINDBYID = "SELECT * FROM direccion WHERE id_direccion=?";
	private static final String FINDBYNUMEROINTCOLONIACALLE = "SELECT * FROM direccion WHERE numero=? and interior=? and id_colonia_calle=?";
	private static final String FINDBYNUMEROCOLONIACALLE = "SELECT * FROM direccion WHERE numero=? AND id_colonia_calle=?";
	private static final String SELECT = "SELECT * FROM direccion";
	private static final String SELECTBYCOLONIACALLE = "SELECT * FROM direccion WHERE id_colonia_calle=?";

	FabricaDeDAOs fabricaMySQL;

	public boolean insertDireccion(DireccionTO DireccionTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setString(1, DireccionTO.getNumero());
			ps.setString(2, DireccionTO.getInterior());
			ps.setString(3, DireccionTO.getEntreCalles());
			ps.setString(4, DireccionTO.getOtrasReferencias());
			ps.setInt(5, DireccionTO.getColoniaCalleTO().getIdColoniaCalle());
			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	public short deleteDireccion(short idDireccion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(DELETE);

			ps.setInt(1, idDireccion);

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	public short updateDireccion(DireccionTO DireccionTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setString(1, DireccionTO.getNumero());
			ps.setString(2, DireccionTO.getInterior());
			ps.setString(3, DireccionTO.getEntreCalles());
			ps.setString(4, DireccionTO.getOtrasReferencias());
			ps.setInt(5, DireccionTO.getColoniaCalleTO().getIdColoniaCalle());
			ps.setInt(6, DireccionTO.getIdDireccion());
			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	public DireccionTO findDireccionById(int idDireccion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idDireccion);

			ResultSet rs = ps.executeQuery();
			fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			ColoniaCalleDAO coloniaCalleDAO = fabricaMySQL.getColoniaCalleDAO();
			if (rs.next()) {
				idDireccion = rs.getInt("id_direccion");
				String numero = rs.getString("numero");
				String interior = rs.getString("interior");
				String entrecalles = rs.getString("entre_calles");
				String otras = rs.getString("otras_referencias");
				ColoniaCalleTO coloniaCalleTO = coloniaCalleDAO
						.findColoniaCalleById(rs.getInt("id_colonia_calle"));
				DireccionTO DireccionTO = new DireccionTO(idDireccion, numero,
						interior, entrecalles, otras, coloniaCalleTO);

				ps.close();
				conexion.close();
				return DireccionTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short deleteDireccion(int idDireccion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(DELETE);

			ps.setInt(1, idDireccion);

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public DireccionTO findDireccionByNumeroIntColoniaCalle(String numero,
			String interior, int idColoniaCalle) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			PreparedStatement ps;
			if (interior != null){
				ps = conexion.prepareStatement(FINDBYNUMEROINTCOLONIACALLE);
				ps.setString(1, numero);

				ps.setString(2, interior);

				ps.setInt(3, idColoniaCalle);
			}
			else{
				ps = conexion.prepareStatement(FINDBYNUMEROCOLONIACALLE);
				ps.setString(1, numero);
				ps.setInt(2, idColoniaCalle);
			}

			

			ResultSet rs = ps.executeQuery();
			fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			ColoniaCalleDAO coloniaCalleDAO = fabricaMySQL.getColoniaCalleDAO();
			if (rs.next()) {
				int idDireccion = rs.getInt("id_direccion");
				String entrecalles = rs.getString("entre_calles");
				String otras = rs.getString("otras_referencias");
				ColoniaCalleTO coloniaCalleTO = coloniaCalleDAO
						.findColoniaCalleById(rs.getInt("id_colonia_calle"));
				DireccionTO DireccionTO = new DireccionTO(idDireccion, numero,
						interior, entrecalles, otras, coloniaCalleTO);

				ps.close();
				conexion.close();
				return DireccionTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public DireccionTO selectDireccionByColoniaCalle(int idColoniaCalle) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			ColoniaCalleDAO coloniaCalleDAO = null;

			ArrayList<Integer> listIdDireccion = null;
			ArrayList<String> listNumero = null;
			ArrayList<String> listInterior = null;
			ArrayList<String> listEntreCalles = null;
			ArrayList<String> listOtrasReferencias = null;

			DireccionTO direccionTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYCOLONIACALLE);
			ps.setInt(1, idColoniaCalle);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdDireccion == null) {

					listIdDireccion = new ArrayList<Integer>();
					listNumero = new ArrayList<String>();
					listInterior = new ArrayList<String>();
					listEntreCalles = new ArrayList<String>();
					listOtrasReferencias = new ArrayList<String>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					coloniaCalleDAO = fabricaMySQL.getColoniaCalleDAO();
				}

				listIdDireccion.add(rs.getInt("id_direccion"));
				listNumero.add(rs.getString("numero"));
				listInterior.add(rs.getString("interior"));
				listEntreCalles.add(rs.getString("entre_calles"));
				listOtrasReferencias.add(rs.getString("otras_referencias"));

			}
			if (listIdDireccion != null) {
				Integer[] arrIdDireccion = (Integer[]) listIdDireccion
						.toArray(new Integer[listIdDireccion.size()]);
				String[] arrNumero = (String[]) listNumero
						.toArray(new String[listNumero.size()]);
				String[] arrInterior = (String[]) listInterior
						.toArray(new String[listInterior.size()]);
				String[] arrEntreCalles = (String[]) listEntreCalles
						.toArray(new String[listEntreCalles.size()]);
				String[] arrOtrasReferencias = (String[]) listOtrasReferencias
						.toArray(new String[listOtrasReferencias.size()]);

				direccionTO = new DireccionTO(arrIdDireccion, arrNumero,
						arrInterior, arrEntreCalles, arrOtrasReferencias,
						coloniaCalleDAO.findColoniaCalleById(idColoniaCalle));
			}
			ps.close();
			conexion.close();
			return direccionTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	public ArrayList<DireccionTO> selectDireccion() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();
			fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			ColoniaCalleDAO coloniaCalleDAO = fabricaMySQL.getColoniaCalleDAO();
			ArrayList<DireccionTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<DireccionTO>();
				int idDireccion = rs.getInt("id_direccion");
				String numero = rs.getString("numero");
				String interior = rs.getString("interior");
				String entrecalles = rs.getString("entre_calles");
				String otras = rs.getString("otras_referencias");
				ColoniaCalleTO coloniaCalleTO = coloniaCalleDAO
						.findColoniaCalleById(rs.getInt("id_colonia_calle"));
				DireccionTO DireccionTO = new DireccionTO(idDireccion, numero,
						interior, entrecalles, otras, coloniaCalleTO);
				coleccion.add(DireccionTO);
			}

			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
}
